<?php
/**
 * Created by PhpStorm.
 * User: Keter
 * Date: 2016/8/10
 * Time: 10:09
 */
class RedisLog extends DatabaseBase
{
    /**
     * 获取消息日志数据
     * @param $desc
     * @param array $data
     */
    public static function info($desc, $data = array(), array $vars = array())
    {
        if (!is_string($desc)) {
            $desc = json_encode($desc, JSON_UNESCAPED_UNICODE);
        }

        if (isset(InfoConfig::$data[$desc])) {
            list($code, $msg) = InfoConfig::$data[$desc];
            $msg = self::replaceDesc($msg, $vars);
        } else {
            $code = 1;
            $msg = $desc;
        }

        return self::formatLog($code, $desc, $msg, $data);
    }

    /**
     * 获取错误日志数据
     * @param $desc
     * @param array $data
     * @param array $vars
     */
    public static function error($desc, $data = array(), array $vars = array())
    {
        if (!is_string($desc)) {
            $desc = json_encode($desc, JSON_UNESCAPED_UNICODE);
        }

        if (isset(ErrorConfig::$data[$desc])) {
            list($code, $msg) = ErrorConfig::$data[$desc];
            $msg = self::replaceDesc($msg, $vars);
        } elseif (WarningConfig::$data[$desc]) {
            list($code, $msg) = WarningConfig::$data[$desc];
            $msg = self::replaceDesc($msg, $vars);
        } else {
            $code = -1;
            $msg = $desc;
        }

        return self::formatLog($code, $desc, $msg, $data);
    }

    /**
     * 获取警告日志数据
     * @param $msg
     * @param array $data
     */
    public static function warning($desc, $data = array(), array $vars = array())
    {
        if (!is_string($desc)) {
            $desc = json_encode($desc, JSON_UNESCAPED_UNICODE);
        }

        if (isset(WarningConfig::$data[$desc])) {
            list($code, $msg) = WarningConfig::$data[$desc];
            $msg = self::replaceDesc($msg, $vars);
        } elseif (isset(ErrorConfig::$data[$desc])) {
            list($code, $msg) = ErrorConfig::$data[$desc];
            $msg = self::replaceDesc($msg, $vars);
        } else {
            $code = -1;
            $msg = $desc;
        }

        return self::formatLog($code, $desc, $msg, $data);
    }

    /**
     * 变量替换
     * @param $msg
     * @param array $vars
     * @return mixed
     */
    public static function replaceDesc($msg, array $vars = array())
    {
        if ($vars) {
            foreach ($vars as $key => $value) {
                $msg = str_replace('${' . $key . '}', $value, $msg);
            }
        }
        $msg = preg_replace('/\$\{\w*\}/', '', $msg);
        return $msg;
    }

    /**
     * 格式化日志数据
     * @param $code
     * @param $msg
     * @param $data
     */
    public static function formatLog($code, $desc, $msg, $data)
    {
        $result = array(
            'time' => time(),
            'code' => $code,
            'desc' => $desc,
            'msg'  => $msg
        );

        if (!is_array($data)) {
            $data = array('data' => $data);
        }

        $result = array_merge($result, $data);

        return $result;
    }
}